// Express是一个流行的Node.js Web应用程序框架  
// Express使用路由和中间件来处理HTTP请求和响应  
// Express支持将路由模块化
// Express可以与各种模板引擎集成，例如EJS
// 下载 express 和 日志插件 log4js
// const express = require('express')
// express 文件夹 在src中进行模块化拆分，使用路由
// 自定义中间件 middleware

// 初始化静态文件
const express = require('express')

const app = express()

// 设置跨域  cors 的设置
app.use('*', (req, res, next) => {          // 使用中间件，* 是让所有请求都经过这个设置

    // res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500')   // 设置允许跨域的地址或者ip
    res.setHeader('Access-Control-Allow-Origin', '*')   // * 表示允许所有资源访问， 但是不安全，还有就是 如果后端支持session的话，是获取不到session的
    // Access-Control-Allow-Methods  cors跨域允许的方法：默认只支持 get、post、head
    res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,PATCH')
    // 设置请求头支持 Content-Type
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
    next()
})

/*
OPTIONS预检请求，浏览器发起的
    满足以下条件中任一个才会发起
        Content-Type 是 application/json 方式的
        有自定义的请求头的
        patch、put、delete等非普通请求

    注意： Content-Type 默认支持 application/x-www-form-urlencoded (get风格的 name=ss&age=20) | multipart/form-data (formData) | text/plain (纯文本)
        所以如果设置了 Content-Type 为 application/json，浏览器会提示 设置了自定义的请求头，
*/

app.post('/info', (req,res) => {
    res.json({
        code: 200,
        type: 'post',
        msg: 'success'
    })
})

app.get('/info', (req, res) => {
    res.set('custom', '123456')  // 添加了自定义的响应头
    res.setHeader('Access-Control-Expose-Headers', 'custom')  // 要将自己设置的自定义响应头抛出，前端才能获取
    res.json({
        code: 200,
        msg: 'success'
    })
})

app.patch('/info', (req, res) => {
    res.json({
        code: 200,
        type: 'patch',
        msg: 'success'
    })
})

// sse 单工通讯
app.get('/sse', (req, res) => {
    res.setHeader('Content-Type', 'text/event-stream')
    res.status(200)
    setInterval(() => {
        res.write('data: test\n')    // 默认是message事件，也可以自定义事件类型
        res.write('data: ' + new Date().getTime() + '\n\n')
    }, 1000)
})

// 防盗链  判断 referer 来源  防盗链一般主要就是验证 host 或者 referer
// 使用中间件
const whiteLink = ['localhost']  // 允许访问的主机地址的白名单
const preventHotLink = (req, res, next) => {
    // 获取referer ,req.get("referer")
    const referer = req.get("referer")          // 必须要有请求才会有referer, 如果是在浏览器直接获取静态文件是没有 referer的
    console.log(referer); // 有可能undefined
    if(referer) {
        const {hostname} = new URL(referer)
        if(!whiteLink.includes(hostname)) {   // 如果不在白名单内，不能访问
            res.status(403).send("禁止访问")
            return
        }
    }
    next()
}

app.use(preventHotLink)

// 初始化静态资源
// app.use(express.static('static'))   // 初始化静态文件夹目录， 访问这个文件夹的静态资源可以不用加static前缀了， 例 http://localhost:8080/xxx.png

// app.use("/assest", express.static('static'))   // 虚拟路由，访问静态文件加 /assest 前缀  例 http://localhost:8080/assest/xxx.html


app.listen(8080, () => {console.log("服务启动成功");})